#include <iostream>
#include <thread>
#include <vector>
#include <string>
#include <mutex>
#include <functional>
#include <condition_variable>
// 抢票逻辑
int static x = 100000;

// void func1(int left,int right)
// {
//     for (int i = left; i < right; ++i)
//     {
//         std::cout <<" "<< i << " ";
//     }
//     std::cout << std::endl;
// }

std::mutex mtx1;
void GetTicket(const std::string &name)
{
    while (true)
    {
        mtx1.lock();
        if (x > 0)
        {
            x--;
            std::cout << name << " get a ticket " << " ticket left->" << x << std::endl;
            mtx1.unlock();
            continue;
        }
        else
        {
            mtx1.unlock();
            break;
        }
    }
}
class Eat
{
public:
    void operator()(const std::string &name)
    {
        while (true)
        {
            std::cout << name << " is eat melon" << std::endl;
            if (x == 0)
                break;
        }
    }
};

// int main()
// {
//     std::thread th1(GetTicket, "th1");
//     std::thread th2(GetTicket, "th2");//函数指针
//     Eat eat1;
//     std::thread th3(&Eat::operator(), &eat1, "th3");//仿函数
//     //
//     std::thread th4([](const std::string &name)
//                     {
//                         while(true)
//                         {
//                             std::cout << name << " is playing games " << std::endl;
//                             if(x == 0)
//                                 break;
//                         } },
//                     "th4");//lambda表达式
//     th1.join();
//     th2.join();
//     th3.join();
//     th4.join();
//     return 0;
// }

// int main()
// {
//     Eat eat1;
//     using service_t = std::function<void(const std::string &name)>;
//     std::vector<service_t> vser = {
//         GetTicket,                                                 // 函数指针
//         std::bind(&Eat::operator(), &eat1, std::placeholders::_1), // 仿函数，但是想要调用，需要对象,于是需要bind
//         [](const std::string &name)
//         {
//                         while(true)
//                         {
//                             std::cout << name << " is playing games " << std::endl;
//                             if(x == 0)
//                                 break;
//                         } } // lambda表达式
//     };

//     std::thread th1(vser[0], "th1");
//     std::thread th2(vser[0], "th2"); // 函数指针
//     std::thread th3(vser[1], "th3"); // 仿函数
//     std::thread th4(vser[2], "th4"); // lambda表达式

//     th1.join();
//     th2.join();
//     th3.join();
//     th4.join();

//     return 0;
// }


int main()
{
    std::condition_variable cv;

    return 0;
}